<?php
/**
 * @author Demianchuk Dmitro
 * @email d.demianchuk@gmail.com
 * @date 24.12.11
 * @version 1.0
 * @package adminArea.components.ATableEditor
 */
class SelectInput extends EditorComponent
{
	/**
	 * @return string
	 */
	public function show(){
		$relations = $this->model->relations();
		$relation = $relations[$this->relationName];
		$optionList = '';
		if($relation[0]==CActiveRecord::BELONGS_TO){
			$optionList = $this->selectBelongsTo($relation);
		}elseif($relation[0]==CActiveRecord::HAS_MANY){
			$optionList = $this->selectHasMany($relation);
		}
		return $optionList;
	}

	/**
	 * @param CActiveRecord $model
	 * @return CActiveRecord
	 */
	public function save($model){
		$relations = $this->model->relations();
		$relation = $relations[$this->relationName];
		if($relation[0]==CActiveRecord::BELONGS_TO){
			if(isset($_POST['_formNull'][$this->name]) && $_POST['_formNull'][$this->name]=='on' && $this->allowNull()){
				$name = $this->name;
				$model->$name = null;
				return $model;
			}
			$name = $this->name;
			if(isset($_POST['_form'][$name])){
				$model->$name = $_POST['_form'][$name];
			}
		}elseif($relation[0]==CActiveRecord::HAS_MANY){
			//Чистим от старых данных
			$relationName = $this->relationName;
			foreach($model->$relationName as $listEl){
				$listEl->delete();
			}
			//Если пользователь хочет сохранить NULL значение то возвращаем модель с очисченой таблицей связей
			if(isset($_POST['_formNull'][$this->name]) && $_POST['_formNull'][$this->name]=='on' && $this->allowNull()){
				return $model;
			}
			$name = $this->name;
			//Смотрим передано нам что-то или нет если да то перебираем и добавляем в базу
			if(isset($_POST['_form'][$name])){
				foreach($_POST['_form'][$name] as $postVal){
					$new = new $relation[1];
					$new->$relation[2] = $model->id;
					$tableColumns = $new->getTableSchema()->columnNames;
					unset($tableColumns[array_search($relation[2],$tableColumns)]);
					$tableColumns = array_values($tableColumns);
					$new->$tableColumns[0] = $postVal;
					if(!$new->save()){
						AMessage::add($new->getErrors(),'warning');
					}
				}
			}
		}
		return $model;
	}

	public function isNull(){
		if($this->itemId==0){
			return true;
		}
		if($this->allowNull()===true){
			$relations = $this->model->relations();
			$relation = $relations[$this->relationName];
			if($relation[0]==CActiveRecord::BELONGS_TO){
				$name = $this->name;
				if($this->current->$name===null){
					return true;
				}
				return false;
			}elseif($relation[0]==CActiveRecord::HAS_MANY){
				$relations = $this->model->relations();
				$relation = $relations[$this->relationName];
				$model = new $relation[1];
				$selectedList = $model->findAll($relation[2].'='.$this->current->id);
				if(count($selectedList)==0){
					return true;
				}
				return false;
			}
		}else{
			return false;
		}
	}

	/**
	 * @return string
	 * @param array $relation - масив отношения с таблицой
	 */
	private function selectBelongsTo($relation){
		$optionList = $this->getLevelItems(null,0,'',$relation,$this->relationName);
		return '<select size="10" name="_form['.$this->name.']">'.$optionList.'</select>';
	}

	/**
	 * @param mixed $parent
	 * @param int $lvl
	 * @param string $optionList
	 * @param array $relation
	 * @param string $relationName
	 * @return string
	 */
	private function getLevelItems($parent,$lvl,$optionList,$relation,$relationName){
		$model = new $relation[1];
		$schema = $model->getTableSchema();
		if(array_search('parent_id',$schema->columnNames)!==false){
			$isParentRow = true;
		}else{
			$isParentRow = false;
		}
		if($isParentRow){
			if($parent===null){
				$list = $model->findAll('parent_id IS :parent',array('parent'=>$parent));
			}else{
				$list = $model->findAll('parent_id = :parent',array('parent'=>$parent));
			}
		}else{
			$list = $model->findAll();
		}
		foreach($list as $v){
			if(!ATableEditor::isNewRecord() && $v->id==$this->current->id &&
				get_class($this->current)==get_class($model)){
				continue;
			}
			//Определяем выделено поле в списке или нет
			//Если новая запись то не одного поле не будет выделено
			if(!ATableEditor::isNewRecord() && $this->current->$relation[2]==$v->id){
				$selected = 'selected';
			}else{
				$selected = '';
			}
			$value = $this->getData($v, 'name', 'string');
			$lvlStr = '';
			for($i=0;$i<$lvl;$i++){
				$lvlStr .= '--';
			}
			$optionList .= '<option '.$selected.' value="'.$v->id.'">'.$lvlStr.$value.'</option>';
			if($isParentRow){
				$optionList = $this->getLevelItems($v->id,$lvl+1,$optionList,$relation,$relationName);
			}
		}
		return $optionList;
	}

	/**
	 * @return string
	 * @param array $relation - масив отношения с таблицой
	 */
	public function selectHasMany($relation){
		//TODO: Сделать поддержку многоуровности категорий для списков с мульти селектом
		//Создаем модель таблици коннектора
		$model = new $relation[1];
		//Узнаем название модели второй таблици в коннекторе
		$connectorRelations = $model->relations();
		foreach($connectorRelations as $k=>$v){
			if($v[2]==$relation[2]){
				unset($connectorRelations[$k]);
			}
		}
		$firstEl = array_shift($connectorRelations);
		//Формируем масив идишек елементов которые выбраны
		$selectedIds = array();
		if($this->itemId!=0){
			$selectedList = $model->findAll($relation[2].'='.$this->current->id);
			foreach($selectedList as $v){
				$selectedIds[] = $v->$firstEl[2];
			}
		}
		//Создаем модель второй таблици коннектора
		$connectedModel = new $firstEl[1];
		$list = $connectedModel->search();
		$optionList = '';
		foreach($list->data as $v){
			array_search($v->id,$selectedIds)!==false ? $selected = 'selected' : $selected = '';
			$value = $this->getData($v, null, 'name');
			$optionList .= '<option '.$selected.' value="'.$v->id.'">'.$value.'</option>';
		}
		return '<select multiple size="10" name="_form['.$this->name.'][]">'.$optionList.'</select>';
	}
}
